﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//二进制的相关操作，在单片机，嵌入式程序非常常见！


//交换a和b的值,不能创建第三变量
//int main()
//{
//	int a = 3;
//	int b = 5;
//	//交换a和b的值
//	printf("a=%d b=%d\n", a, b);
//	/*int c = a;
//	a = b;
//	b = c;*/
//
//	/*a = a + b;
//	b = a - b;
//	a = a - b;*/
//	//这种写法存在缺陷：a和b如果非常的，求和后的结果超过了整型的最大值
//
//	//不会溢出
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("a=%d b=%d\n", a, b);
//
//	//异或操作符的特点
//	//a^a=0
//	//0^a=a
//	//支持交换律
//	//3^3^5=5
//	//3^5^3=5
//
//	return 0;
//}


// 编写代码实现：求一个整数存储在内存中的二进制中1的个数
//方一：
//int main()
//{
//	int n = 0;
//	int count = 0;
//	scanf("%d", &n);
//	int i = 0;
//	for (i = 0; i < 32; i++)
//	{
//		//a & 1 == 1;
//		//a & 0 == 0;
//		if (((n >> i) & 1) == 1)
//			count++;
//	}
//	printf("二进制中1的个数为：%d\n", count);
//
//	return 0;
//}
//方二
//int main()
//{
//	unsigned int n = 0;
//	int count = 0;
//	scanf("%d", &n);
//	while (n)
//	{
//		if (n % 2 == 1)
//			count++;
//		n = n / 2;
//	}
//	printf("二进制中1的个数为：%d\n", count);
//
//	return 0;
//}
//方三
//int main()
//{
//	int n = 0; 
//	scanf("%d", &n);
//	int count = 0;
//	while (n)
//	{
//		n = n & (n - 1);
//		count++;
//	}
//	printf("二进制中1的个数为：%d\n", count);
//
//	return 0;
//}

//n = n & (n - 1);理解
//n=15
//1111 -  n
//1110 -  n-1
//1110 -  n
//1101 -  n-1
//1100 -  n
//1011 -  n-1
//1000 -  n
//0111 -  n-1
//0000 -  n

//
//判断一个数n是否是2的倍数
//10//100
//1000  ……
//int main()
//{
//	int  n = 0;
//	scanf("%d", &n);
//	if ((n & (n - 1)) == 0)
//		printf("Yes\n");
//	else
//		printf("No\n");
//
//	return 0;
//}

//
//二进制位置0或者置1
//编写代码将13二进制序列的第5位修改成1，然后再改回0
//int main()
//{
//	int a = 13;
//	a = a | (1 << 4);//修改为1
//	printf("a = %d\n", a);
//	a = a & ~(1 << 4);//再改为0
//	printf("a = %d\n", a);
//
//	return 0;
//}



//获取一个整数二进制序列中所有的偶数位和奇数位，分别打印出二进制序列
//void Printbit(int num)
//{
//    printf("偶数位为：\n");
//    for (int i = 31; i >= 1; i -= 2)
//    {
//        printf("%d ", (num >> i) & 1);
//    }
//    printf("\n");
//    printf("奇数位为：\n");
//    for (int i = 30; i >= 0; i -= 2)
//    {
//        printf("%d ", (num >> i) & 1);
//    }
//    printf("\n");
//}
//
//int main()
//{
//    int num = 0;
//    scanf("%d", &num);
//
//    Printbit(num);
//
//    return 0;
//}


//编程实现：两个int（32位）整数m和n的二进制表达中，有多少个位(bit)不同？ 
//输入例子 :1999 2299
// 
//输出例子 : 7

//方一
//int main() {
//    int a, b;
//    scanf("%d %d", &a, &b);
//    int i = 0;
//    int count = 0;
//    for (i = 0; i < 32; i++)
//    {
//        if (((a >> i) & 1) != ((b >> i) & 1))
//            count++;
//    }
//    printf("%d\n", count);
//    return 0;
//}
//方二
//int main() {
//    int a, b;
//    int count = 0;
//
//    scanf("%d %d", &a, &b);
//
//    int c = a ^ b;
//
//    for (int i = 0; i < 32; i++) {
//        if (((c >> i) & 1) == 1)
//        {
//            count++;
//        }
//    }
//
//    printf("%d", count);
//
//    return 0;
//}/

//找单身狗
//在一个整型数组中，只有一个数字出现一次，其他数组都是成对出现的，请找出那个只出现一次的数字。
//例如：数组中有：1 2 3 4 5 1 2 3 4，只有5出现一次，其他数字都出现2次，找出5
// 方一
//int main()
//{
//    int arr[] = { 1,2,3,4,5,1,2,3,4 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int i = 0, j = 0;
//    for (i = 0; i < sz; i++)
//    {
//        int n = arr[i];
//        for (j = 0; j < sz; j++)
//        {
//            if (i == j)
//            {
//                continue;
//            }
//            if (n == arr[j])
//            {
//                break;
//            }
//        }
//        if (j == sz)
//        {
//            printf("%d ", arr[i]);
//        }
//    }
//    
//    return 0;
//}

//方二
//	//异或操作符的特点
//	//a^a=0
//	//0^a=a
//	//支持交换律
//	//3^3^5=5
//	//3^5^3=5

//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int num = 0;
//	for (int i = 0; i < sz; i++)
//	{
//		num = num ^ arr[i];
//	}
//	printf("%d ", num);
//
//	return 0;
//}



